﻿using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace GENERIC.DBProvider.SqlServer
{
    /// <summary>
    /// Provider Sql Server
    /// </summary>
    public class SqlServerProvider : DBProvider
    {
        #region Constructeur

        /// <summary>
        /// Initialise une nouvelle instance de la classe SqlServerProvider
        /// </summary>
        /// <param name="connectionString">chaîne de connexion</param>
        public SqlServerProvider(string connectionString) : base(connectionString)
        {
        }

        /// <summary>
        /// Initialise une nouvelle instance de la classe SqlProvider
        /// </summary>
        /// <param name="dataSource">source de données</param>
        /// <param name="initialCatalog">nom de la base de données</param>
        /// <param name="userId">utilisateur</param>
        /// <param name="password">mot de passe</param>
        /// <param name="namedPipes">canaux nommés</param>
        /// <param name="decryptPassword">true pour décrypter le mot de passe, false sinon</param>
        public SqlServerProvider(string dataSource, string initialCatalog, string userId, string password, bool namedPipes)
            : this(new SqlConnectionStringBuilder()
            {
                DataSource = dataSource,
                InitialCatalog = initialCatalog,
                UserID = userId,
                Password = password,
                NetworkLibrary = (namedPipes ? "dbnmpntw" : "dbmssocn")
            }.ConnectionString)
        {
        }

        #endregion

        #region Propriétés

        /// <summary>
        /// Obtient le nom de la base de données
        /// </summary>
        public string InitialCatalog
        {
            get
            {
                return CreateDbConnectionStringBuilder(ConnectionString)["Initial Catalog"].ToString();
            }
        }

        /// <summary>
        /// Obtient le nom du serveur et de la base de données
        /// </summary>
        public override string ServerName
        {
            get
            {
                return base.ServerName + " Nom de la base de données: " + InitialCatalog;
            }
        }

        /// <summary>
        /// Obtient le nom de la base de données
        /// </summary>
        public override string DatabaseName
        {
            get { return InitialCatalog; }
        }

        /// <summary>
        /// Obtient le type de connexion
        /// </summary>
        public override eConnectionType ConnectionType
        {
            get { return eConnectionType.SQLServer; }
        }

        #endregion

        #region Méthodes

        /// <summary>
        /// Création d'une nouvelle connection
        /// </summary>
        /// <returns>une nouvelle connection</returns>
        protected override DbConnection CreateDbConnection()
        {
            return new SqlConnection();
        }

        /// <summary>
        /// Création du constructeur de chaîne de connexion
        /// </summary>
        /// <param name="connectionString">chaîne de connexion</param>
        /// <param name="password">mot de passe</param>
        protected override DbConnectionStringBuilder CreateDbConnectionStringBuilder(string connectionString)
        {
            return new SqlConnectionStringBuilder(connectionString);
        }

        #endregion
    }
}
